#include <iostream>
#include <string>
#include <queue>
using namespace std;
#define MAXN 100
#define INF 10000
char map[MAXN][MAXN];
int mintime[MAXN][MAXN];
int n,m;
int dst_x,dst_y;

struct point
{
 	int x,y;
 	int step;
 	int time;
};

queue<point> q;
 
 int dir[][2]={{1,0},{-1,0},{0,1},{0,-1}};
 
 int bfs(point s)
 {
 	q.push(s);
 	point h;
 	while(!q.empty()){
 		h=q.front();
 		q.pop();
 		for(int i=0;i<4;i++){
 			point t;
 			t.x=h.x+dir[i][0];
 			t.y=h.y+dir[i][1];
 			t.time=h.time+1;
 			t.step=h.step+1;
 			if(t.x>=0&&t.x<n&&t.y>=0&&t.y<m&&map[t.x][t.y]!='#'){
 				if(map[t.x][t.y]=='x') t.time++;
 				if(t.time<mintime[t.x][t.y]){
 					mintime[t.x][t.y]=t.time;
 					q.push(t);
 				}
 			}
 		}
 	}
 	return mintime[dst_x][dst_y];
 } 
 
 int main(void)
 {
 	cin>>n>>m;
 	int src_x,src_y;
 	point begin;
 	for(int i=0;i<n;i++){
 		for(int j=0;j<m;j++) {
 			cin>>map[i][j];
 			mintime[i][j]=INF;
 			if(map[i][j]=='r'){
 				begin.x=i;
 				begin.y=j;
				begin.step=0;
				begin.time=0; 
 			}
 			if(map[i][j]=='a'){
 				dst_x=i;
 				dst_y=j;
 			}
 		}
 	}
 	//memset(visited,0,sizeof(visited));
 	mintime[begin.x][begin.y]=0;
 	cout<<bfs(begin)<<endl;
 	return 0;
 }
 
 
